You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#8670607ebf9 Thanks @tt-a1i! - Fixed #8345: useAdjacentOverloadSignatures no longer reports false positives for static and instance methods with the same name. Static methods and instance methods are now treated as separate overload groups.
classKek{statickek(): number{return0;}another(): string{return"";}kek(): number{return1;}// no longer reported as non-adjacent}
#947697b80a8 Thanks @masterkain! - Fixed #9475: Fixed a panic when Biome analyzed ambient TypeScript modules containing class constructor, getter, or setter signatures that reference local type aliases. Biome now handles these declarations without crashing during semantic analysis.
#95530cd5298 Thanks @dyc3! - Fixed a bug where enabling the rules of a whole group, would enable rules that belonged to a domain under the same group.
For example, linter.rules.correctness = "error" no longer enables React- or Qwik-specific correctness rules unless linter.domains.react, linter.domains.qwik, or an explicit rule config also enables them, or their relative dependencies are installed.
#95864cafb71 Thanks @dyc3! - Fixed #8828: Grit patterns using export { $foo } from $source now match named re-exports in JavaScript and TypeScript files.
#9550d4e3d6e Thanks @dyc3! - Fixed #9548: Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression.
#8696a7c19cc Thanks @Faizanq! - Fixed #8685 where noUselessLoneBlockStatements would remove empty blocks containing comments. The rule now preserves these blocks since comments may contain important information like TODOs or commented-out code.
#95576671ac5 Thanks @datalek! - Fixed #9557: Biome's LSP server no longer crashes on startup when used with editors that don't send workspaceFolders during initialization. This affected any LSP client that only sends rootUri, which is valid per the LSP specification.
#94551710cf1 Thanks @omar-y-abdi! - Fixed #9174: useExpect now correctly rejects asymmetric matchers in Vitest or Jest like expect.stringContaining(), expect.objectContaining(), and utilities like expect.extend() that are not valid assertions. Previously these constructs caused false negatives, allowing tests without real assertions to pass the lint rule.
#9584956e367 Thanks @ematipico! - Fixed a bug where Vue directive attribute values like v-bind:class="{'dynamic': true}" were incorrectly parsed as JavaScript statements instead of expressions. Object literals inside directive values like :class, v-if, and v-html are now correctly parsed as expressions, preventing spurious parse errors.
#9474e168494 Thanks @ematipico! - Added the new nursery rule noUntrustedLicenses. This rule disallows dependencies that ship with invalid licenses or licenses that don't meet the criteria of your project/organisation.
The rule has the following options:
allow: a list of licenses that can be allowed. Useful to bypass possible invalid licenses from downstream dependencies.
deny: a list of licenses that should trigger the rule. Useful to deny licenses that don't fit your project/organisation.
When both deny and allow are provided, deny takes precedence.
requireOsiApproved: whether the licenses need to be approved by the Open Source Initiative.
#95558a3647b Thanks @ematipico! - Fixed #188: the Biome Language Server no longer panics when open files change abruptly, such as during git branch checkouts.
#9605f65c637 Thanks @ematipico! - Fixed #9589. Now Biome correctly parses object expressions inside props and directives. The following code doesn't emit errors anymore:
<styleis:globaldefine:vars={{ bgLight: light }}>
<Component name={{ first, name }} />
#9565ccb249e Thanks @eyupcanakman! - Fixed #9505: noUselessStringConcat no longer reports tagged template literals as useless string concatenations. Tagged templates invoke a function and can return non-string values, so combining them with + is not equivalent to a single template literal.
#95344d050df Thanks @Netail! - Added the nursery rule noInlineStyles. The rule disallows the use of inline style attributes in HTML and the style prop in JSX, including React.createElement calls. Inline styles make code harder to maintain and can interfere with Content Security Policy.
#9611cddaa44 Thanks @gaauwe! - Fixed a regression where Biome LSP could misread editor settings sent through workspace/didChangeConfiguration when the payload was wrapped in a top-level biome key. This caused requireConfiguration and related settings to be ignored in some editors.
#9488bc709f6 Thanks @mvanhorn! - Fixed #9463: the "Biome found a configuration file outside of the current working directory" diagnostic now includes the configuration file path and the working directory, giving users actionable information to debug the issue.
#95272f8bf80 Thanks @mdm317! - Fixed #8959: Fixed TypeScript arrow function formatting when a comment appears after =>.
#95311302740 Thanks @ematipico! - Fixed #9187: Astro frontmatter containing regex literals with quotes (/'/, /"/) or dashes (/---/) no longer causes parse errors.
#9535b630d93 Thanks @leno23! - Fixed #9524: remove extra space before > when bracketSameLine is true and the self-closing slash is absent in HTML formatter.
#953781e6306 Thanks @ematipico! - Fixed #9238: The HTML parser no longer incorrectly reports --- inside element content (e.g. <td>---</td>) as an "Unexpected value or character" error.
#95324b64145 Thanks @ematipico! - Fixed #9117: biome check --write no longer falsely reports Svelte and Vue files as changed when html.formatter.indentScriptAndStyle is enabled and the files are already correctly formatted.
#952861451ef Thanks @ematipico! - Fixed #9341: Fixed an LSP crash that could corrupt file content when saving with format-on-save enabled.
#9538794f79c Thanks @ematipico! - Fixed #9279: The rule noSubstr now detects .substr() and .substring() calls in all expression contexts, including variable declarations, function arguments, return statements, and arrow function bodies.
#9462c23272c Thanks @ematipico! - Fixed #9370: The resolver now correctly prioritizes more specific exports patterns over less specific ones. Previously, a pattern like "./*" could match before "./features/*", causing resolution failures for packages with overlapping subpath patterns.
#9515f85c069 Thanks @shivamtiwari3! - Fixed #9506 and #9479: Biome no longer reports false parse errors on <script type="speculationrules"> and <script type="application/ld+json"> tags. These script types contain non-JavaScript content and are now correctly skipped by the embedded language detector.
#95147fe43c8 Thanks @ematipico! - Fixed #6964: Biome now correctly resolves the .gitignore file relative to vcs.root when configured. Previously, the vcs.root setting was ignored and Biome always looked for the ignore file in the workspace directory.
#9521af39936 Thanks @ematipico! - Fixed #9483. Now the rule noRedeclare doesn't panic when it encounters constructor overloads.
#949060cf024 Thanks @willfarrell! - Added support for modern CSS properties, pseudo-classes, and pseudo-elements.
New known properties: dynamic-range-limit, overlay, reading-flow, reading-order, scroll-marker-group, scroll-target-group.
New pseudo-elements: ::checkmark, ::column, ::picker, ::picker-icon, ::scroll-button, ::scroll-marker, ::scroll-marker-group.
New pseudo-classes: :active-view-transition-type, :has-slotted, :target-after, :target-before, :target-current.
#95264d42823 Thanks @ematipico! - Fixed #9358 and #9375. Now attributes that have text expressions such as class={buttonClass()} are correctly tracked in Svelte files.
#952061f53ee Thanks @ematipico! - Fixed #9519. Now noUnusedVariables doesn't flag variables that are used as typeof type.
#9487331dc0d Thanks @mvanhorn! - Fixed #9477: source.fixAll.biome no longer sorts imports when source.organizeImports.biome is disabled in editor settings. The organize imports action is now excluded from the fix-all pass unless explicitly requested.
#93183ac98eb Thanks @ematipico! - Added new nursery lint rule useBaseline for CSS. The rule reports when CSS properties, property values, at-rules, media conditions, functions, or pseudo-selectors are not part of the configured Baseline tier.
For example, at the time of writing, the rule will trigger for the use of accent-color because it has limited availability:
a {
accent-color: bar;
}
#92722de8362 Thanks @terror! - Added the nursery rule useImportsFirst that enforces all import statements appear before any non-import statements in a module. Inspired by the eslint-plugin-import import/first rule.
#94356c5a8f2 Thanks @siketyan! - Fixed #9432: Values referenced as a JSX element in Astro/Vue/Svelte templates are now correctly detected; noUnusedImports and useImportType rules no longer reports these values as false positives.
#9362fc9ca4c Thanks @Netail! - Extra rule source references. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
#9392b881fea Thanks @g-ortuno! - Fixed biomejs/biome-vscode#959: LSP now correctly resolves project directory when configurationPath points to a configuration file outside the workspace.
#9420a1c46af Thanks @ematipico! - Fixed #9385: noUselessEscapeInString no longer incorrectly flags valid CSS hex escapes (e.g. \e7bb) as useless. The rule now recognizes all hex digits (0-9, a-f, A-F) as valid escape characters in CSS strings.
#9416f2581b8 Thanks @ematipico! - Fixed #9131, #9112, #9166: the formatter no longer crashes or produces corrupt output when a JS file with experimentalEmbeddedSnippetsEnabled contains non-embedded template literals alongside embedded ones (e.g. console.log(\test`)next tographql(`...`)`).
#9344cb4d7d7 Thanks @ematipico! - Fixed #6921: noShadow no longer incorrectly flags destructured variable bindings in sibling scopes as shadowing. Object destructuring, array destructuring, nested patterns, and rest elements are now properly recognized as declarations.
#9360bc5dd99 Thanks @ematipico! - Fixed #7125: The rule noShadow no longer incorrectly flags parameters in TypeScript constructor and method overload signatures.
#937129cac17 Thanks @ematipico! - Fixed #5279: Tabs in diagnostic diff output are now rendered at a consistent width across context and changed lines, fixing visual misalignment when source files use tab indentation.
#904361e2a02 Thanks @dyc3! - Fixed #8897: Biome now parses @utility names containing / when Tailwind directives are enabled.
#9354930c858 Thanks @denbezrukov! - Improved CSS parser recovery for invalid unicode-range values that mix wildcard ranges with range intervals. For example, Biome now reports clearer diagnostics for invalid syntax like:
× Wildcard ranges cannot be combined with a range interval.
> unicode-range: U+11???-2??;
^
× Expected a codepoint but instead found ';'.
> unicode-range: U+11???-;
^
#935578e74a2 Thanks @SchahinRohani! - Fixed #9349: Biome now correctly handles Vue dynamic :alt and v-bind:alt bindings in useAltText, preventing false positives in .vue files.
#934570c2d4e Thanks @ematipico! - Fixed #7214: useOptionalChain now detects optional chain patterns that don't start at the beginning of a logical AND expression. For example, bar && foo && foo.length is now correctly flagged and fixed to bar && foo?.length.
#931178c4e9b Thanks @ruidosujeira! - Fixed #9245: the useSemanticElements rule no longer suggests <output> for role="status" and role="alert". The <output> element is only a relatedConcept of these roles, not a direct semantic equivalent. These roles are now excluded from suggestions, aligning with the intended behavior of the upstream prefer-tag-over-role rule.
#9363b2ffb4a Thanks @ematipico! - Fixed #5212: useSemanticElements no longer reports a diagnostic when a semantic element already has its corresponding role attribute (e.g. <nav role="navigation">, <footer role="contentinfo">). These cases are now correctly left to noRedundantRoles.
- export { b, a };- export { c };+ export { a, b, c };
Also, organizeImports now correctly adds a blank line between an import chunk
and an export chunk.
import { A } from "package";
+
export { A };
#8658bdcc934 Thanks @rksvc! - When the domains field is set in the configuration file, domains is now automatically enabled when Biome detects certain dependencies in package.json.
#9383f5c8bf0 Thanks @ematipico! - Fixed #6606: The type inference engine now resolves Record<K, V> types, synthesizing them as object types with index signatures. This improves accuracy for type-aware lint rules such as noFloatingPromises, noMisusedPromises, useAwaitThenable, and useArraySortCompare when operating on Record-typed values.
#9359701ddd3 Thanks @ematipico! - Fixed #7516: noUnusedImports no longer reports a false positive when a local variable shadows an imported type namespace that is still used in a type annotation.
#947350e93bd Thanks @ematipico! - Improved the detection of variables inside Astro files. Now the rule noUnusedVariables and others will trigger fewer false positives.
#9459171b2ee Thanks @ematipico! - Fixed #9314. Now Biome doesn't panic when useAriaPropsForRole is configured using an object.
#9333a294b89 Thanks @terror! - Fixed #9310. Now the HTML formatter doesn't mangle elements that are followed by self-closing elements such as <br> or <img>.
#93914bffb66 Thanks @ematipico! - Slightly increased the performance of the CLI in projects that have more than ~2K files.
#930540869b5 Thanks @ematipico! - Fixed #4946: noUnreachable no longer reports code inside finally blocks as unreachable when there is a break, continue, or return in the corresponding try body.
#9303464910c Thanks @ematipico! - Fixed #2786: The formatter no longer produces different output on subsequent runs when a case clause has a trailing line comment followed by a single block statement.
#932685dfe9b Thanks @dyc3! - Improved performance for noImportCycles by explicitly excluding node_modules from the cycle detection. The performance improvement is directly proportional to how big your dependency tree is.
#9323d5ee469 Thanks @ematipico! - Fixed #9217 and biomejs/biome-vscode#959, where the Biome language server didn't correctly resolve the editor setting configurationPath when the provided value is a relative path.
#930286fbc70 Thanks @sepagian! - Fixed #9300: Lowercase component member expressions like <form.Field> in Svelte and Astro files are now correctly formatted.
#9185e43e730 Thanks @dyc3! - Added the nursery rule useVueScopedStyles for Vue SFCs. This rule enforces that <style> blocks have the scoped attribute (or module for CSS Modules), preventing style leakage and conflicts between components.
#918449c8fde Thanks @chocky335! - Improved plugin performance by batching all plugins into a single syntax visitor with a kind-to-plugin lookup map, reducing per-node dispatch overhead from O(N) to O(1) where N is the number of plugins.
#92214612133 Thanks @ematipico! - Fixed an issue where the JSON reporter didn't contain the duration of the command.
#92941805c8f Thanks @Netail! - Extra rule source reference. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
Now, these rules will no longer produce errors in test cases that used these constructs instead of expect:
import{expectTypeOf,assert,assertType}from"vitest";constmyStr="Hello from vitest!";it("should be a string",()=>{expectTypeOf(myStr).toBeString();});test("should still be a string",()=>{assertType<string>(myStr);});it.todo("should still still be a string",()=>{assert(typeofmyStr==="string");});
#89521d2ca15 Thanks @pkallos! - Added the nursery rule useNullishCoalescing. This rule suggests using the nullish coalescing operator (??) instead of logical OR (||) when the left operand may be nullish. This prevents bugs where falsy values like 0, '', or false are incorrectly treated as missing. Addresses #8043
#925996939c0 Thanks @ematipico! - Fixed CSS formatter incorrectly collapsing selectors when a BOM (Byte Order Mark) character is present at the start of the file. The formatter now correctly preserves line breaks between comments and selectors in BOM-prefixed CSS files, matching Prettier's behavior.
#925159e33fb Thanks @ematipico! - Fixed #9249: The CSS formatter no longer incorrectly breaks ratio values (like 1 / -1) across lines when followed by comments.
#9215b2619a1 Thanks @FrederickStempfle! - Fixed #9189: biome ci in GitHub Actions now correctly disables colors so that ::error/::warning workflow commands are not wrapped in ANSI escape codes.
#925665ae4c1 Thanks @ematipico! - Fixed JSON reporter escaping of special characters in diagnostic messages. The JSON reporter now properly escapes double quotes, backslashes, and control characters in error messages and advice text, preventing invalid JSON output when diagnostics contain these characters.
#92235b9da81 Thanks @ematipico! - Fixed an issue where the JSON reporter didn't write output to a file when --reporter-file was specified. The output is now correctly written to the specified file instead of always going to stdout.
#9154c487e54 Thanks @abossenbroek! - Fixed #9115: The noPlaywrightMissingAwait rule no longer produces false positives on jest-dom matchers like toBeVisible, toBeChecked, toHaveAttribute, etc. For matchers shared between Playwright and jest-dom, the rule now checks whether expect()'s argument is a Playwright locator or page object before flagging. Added semantic variable resolution so that extracted Playwright locators (e.g. const loc = page.locator('.item'); expect(loc).toBeVisible()) are still correctly flagged.
#926933e5cdf Thanks @dyc3! - Fixed a false positive where noUndeclaredVariables reported bindings from Vue <script setup> as undeclared when used in <template>.
This change ensures embedded bindings collected from script snippets (like imports and defineModel results) are respected by the rule.
node:fs, node:path, node:url, and other Node.js built-in modules with the node: prefix are now accepted.
Packages that declare their TypeScript entry point via "typings" (instead of "types") in package.json now resolve correctly.
Named imports from aliased re-export chains (e.g. export { x as y } from "...") are now resolved correctly through the alias.
Namespace re-exports (e.g. export * as Ns from "...") are now recognized as own exports of the barrel module.
#9254f7bf12b Thanks @ematipico! - Fixed #8842: The CSS formatter now correctly formats @container scroll-state() without adding an unwanted space between the function name and opening parenthesis.
#92112d0b8e6 Thanks @ematipico! - Fixed #7905. Improved the accuracy of type-aware lint rules when analyzing re-exported functions and values.
Previously, when a binding was imported from another module, its type was not correctly inferred during the type analysis phase. This caused type-aware lint rules to fail to detect issues when working with re-exported imports.
The following rules now correctly handle re-exported imports:
// getValue.tsexportasyncfunctiongetValue(): Promise<number>{return42;}// reexport.tsexport{getValue}from"./getValue";// index.tsimport{getValue}from"./reexport";// Previously: no diagnostic (type was unknown)// Now: correctly detects that getValue() returns a PromiseawaitgetValue();// Valid - properly awaitedgetValue();// Diagnostic - floating promise
#8934b49707c Thanks @tim-we! - Fixed #8265: Biome now correctly detects test framework calls that use three arguments (label, options, callback) (e.g., describe("foo", { retry: 2 }, () => {})). This fixes both formatting and the noDuplicateTestHooks lint rule for test frameworks like Vitest.
#9191688fd34 Thanks @dyc3! - Fixed #9180: fixed a panic caused by an interaction between noRedundantUseStrict and the formatter
[#&#
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
If you want to rebase/retry this PR, check this box
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.3.14
chore(deps): update dependency @biomejs/biome to v2.3.15
Feb 14, 2026
This PR updates @biomejs/biome from version 2.3.13 to 2.4.9, spanning multiple minor and patch releases (2.4.0 through 2.4.9).
Major Changes Introduced:
HTML Formatter Overhaul (v2.4.0): Complete rewrite to align with Prettier's formatting behavior. This primarily affects HTML, Vue, Svelte, and Astro files.
Embedded Snippets Support: New experimental feature for formatting and linting CSS and GraphQL within JavaScript template literals (requires opt-in).
New Lint Rules: 24 rules promoted from nursery to stable, plus 15 new HTML accessibility rules.
Enhanced Parser Support: Improved Vue and Svelte parsing, CSS Modules auto-detection, Temporal API globals support.
Bug Fixes: Over 50 bug fixes across versions 2.4.1-2.4.9 addressing parser errors, formatter inconsistencies, and false positives in lint rules.
Breaking Changes:
None that affect this project. The HTML formatter changes only impact HTML/Vue/Svelte/Astro files (none present in this codebase).
Configuration schema updated from 2.3.13 to 2.4.9 (automatically handled in the PR).
Security Fixes:
No published security advisories found for any version in this range.
No CVEs or security-related changes mentioned in changelogs.
Notable Bug Fixes:
Fixed noUnreachable false positives with finally blocks
Fixed useOptionalChain detection of negated OR chains
Fixed noUnusedVariables with TypeScript type namespaces
Improved noUnresolvedImports resolution for Node.js built-ins and package.json typings field
Fixed LSP crashes and configuration path resolution issues
🎯 Impact Scope Investigation
Current Usage Analysis:
Configuration File: biome.json uses basic configuration (formatter, linter with recommended rules, assist with import organization)
File Types: Project only contains TypeScript (.ts) and JSON files - no HTML, Vue, Svelte, or Astro files
Features Used: Standard formatting, linting, and import organization
No Experimental Features: Project doesn't use embedded snippets or other experimental features
Verification Results:
✅ Lint Check: bunx biome check - Passed (25 files, 0 issues)
✅ Format Check: bunx biome check --write - Passed (no changes needed)
✅ Tests: All 59 tests passed
✅ Build: TypeScript compilation successful
✅ Type Check: No type errors
✅ Migration Check: bunx biome migrate - Configuration already up to date
✅ CI Checks: All GitHub Actions workflows passing (Build, Lint, Test, Typecheck)
Dependencies Impact:
This is a devDependency update only
No runtime dependencies affected
No transitive dependency conflicts identified
Configuration Compatibility:
Current biome.json configuration is fully compatible with 2.4.9
Schema URL already updated from 2.3.13 to 2.4.9 in the PR
No manual configuration migration required
💡 Recommended Actions
Immediate Action:
✅ Safe to merge immediately - All checks pass and no breaking changes affect this project.
Post-Merge Actions:
✅ No code changes required - existing code is fully compatible
✅ No configuration changes needed - biome migrate confirms config is up to date
✅ No test updates required - all tests passing with new version
Optional Considerations:
If the team wants to explore new features in the future:
Experimental embedded snippets support (for CSS-in-JS if ever used)
New accessibility lint rules (if HTML files are added)
Rule profiling with --profile-rules flag (for performance analysis)
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.3.15
chore(deps): update dependency @biomejs/biome to v2.4.0
Feb 18, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.0
chore(deps): update dependency @biomejs/biome to v2.4.1
Feb 19, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.1
chore(deps): update dependency @biomejs/biome to v2.4.2
Feb 20, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.2
chore(deps): update dependency @biomejs/biome to v2.4.3
Feb 22, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.3
chore(deps): update dependency @biomejs/biome to v2.4.4
Feb 23, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.4
chore(deps): update dependency @biomejs/biome to v2.4.5
Mar 5, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.5
chore(deps): update dependency @biomejs/biome to v2.4.6
Mar 8, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.6
chore(deps): update dependency @biomejs/biome to v2.4.7
Mar 16, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.7
chore(deps): update dependency @biomejs/biome to v2.4.8
Mar 21, 2026
renovatebot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.8
chore(deps): update dependency @biomejs/biome to v2.4.9
Mar 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
2.3.13→2.4.92.3.13→2.4.9Release Notes
biomejs/biome (@biomejs/biome)
v2.4.9Compare Source
Patch Changes
#9315
085d324Thanks @ematipico! - Added a new nursery CSS rulenoDuplicateSelectors, that disallows duplicate selector lists within the same at-rule context.For example, the following snippet triggers the rule because the second selector and the first selector are the same:
#9567
b7ab931Thanks @ematipico! - Fixed #7211:useOptionalChainnow detects negated logical OR chains. The following code is now considered invalid:#8670
607ebf9Thanks @tt-a1i! - Fixed #8345:useAdjacentOverloadSignaturesno longer reports false positives for static and instance methods with the same name. Static methods and instance methods are now treated as separate overload groups.#9476
97b80a8Thanks @masterkain! - Fixed#9475: Fixed a panic when Biome analyzed ambient TypeScript modules containing class constructor, getter, or setter signatures that reference local type aliases. Biome now handles these declarations without crashing during semantic analysis.#9553
0cd5298Thanks @dyc3! - Fixed a bug where enabling the rules of a whole group, would enable rules that belonged to a domain under the same group.For example,
linter.rules.correctness = "error"no longer enables React- or Qwik-specific correctness rules unlesslinter.domains.react,linter.domains.qwik, or an explicit rule config also enables them, or their relative dependencies are installed.#9586
4cafb71Thanks @dyc3! - Fixed #8828: Grit patterns usingexport { $foo } from $sourcenow match named re-exports in JavaScript and TypeScript files.#9550
d4e3d6eThanks @dyc3! - Fixed #9548: Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression.#8696
a7c19ccThanks @Faizanq! - Fixed #8685 wherenoUselessLoneBlockStatementswould remove empty blocks containing comments. The rule now preserves these blocks since comments may contain important information like TODOs or commented-out code.#9557
6671ac5Thanks @datalek! - Fixed #9557: Biome's LSP server no longer crashes on startup when used with editors that don't sendworkspaceFoldersduring initialization. This affected any LSP client that only sendsrootUri, which is valid per the LSP specification.#9455
1710cf1Thanks @omar-y-abdi! - Fixed #9174:useExpectnow correctly rejects asymmetric matchers in Vitest or Jest likeexpect.stringContaining(),expect.objectContaining(), and utilities likeexpect.extend()that are not valid assertions. Previously these constructs caused false negatives, allowing tests without real assertions to pass the lint rule.#9584
956e367Thanks @ematipico! - Fixed a bug where Vue directive attribute values likev-bind:class="{'dynamic': true}"were incorrectly parsed as JavaScript statements instead of expressions. Object literals inside directive values like:class,v-if, andv-htmlare now correctly parsed as expressions, preventing spurious parse errors.#9474
e168494Thanks @ematipico! - Added the new nursery rulenoUntrustedLicenses. This rule disallows dependencies that ship with invalid licenses or licenses that don't meet the criteria of your project/organisation.The rule has the following options:
allow: a list of licenses that can be allowed. Useful to bypass possible invalid licenses from downstream dependencies.deny: a list of licenses that should trigger the rule. Useful to deny licenses that don't fit your project/organisation.When both
denyandalloware provided,denytakes precedence.requireOsiApproved: whether the licenses need to be approved by the Open Source Initiative.requireFsfLibre: whether the licenses need to be approved by the Free Software Foundation.#9544
723798bThanks @ViniciusDev26! - Added an unsafe fix touseConsistentMethodSignaturesthat automatically converts between method-style and property-style signatures.#9555
8a3647bThanks @ematipico! - Fixed#188: the Biome Language Server no longer panics when open files change abruptly, such as during git branch checkouts.#9605
f65c637Thanks @ematipico! - Fixed #9589. Now Biome correctly parses object expressions inside props and directives. The following code doesn't emit errors anymore:#9565
ccb249eThanks @eyupcanakman! - Fixed #9505:noUselessStringConcatno longer reports tagged template literals as useless string concatenations. Tagged templates invoke a function and can return non-string values, so combining them with+is not equivalent to a single template literal.#9534
4d050dfThanks @Netail! - Added the nursery rulenoInlineStyles. The rule disallows the use of inlinestyleattributes in HTML and thestyleprop in JSX, includingReact.createElementcalls. Inline styles make code harder to maintain and can interfere with Content Security Policy.#9611
cddaa44Thanks @gaauwe! - Fixed a regression where Biome LSP could misread editor settings sent throughworkspace/didChangeConfigurationwhen the payload was wrapped in a top-levelbiomekey. This causedrequireConfigurationand related settings to be ignored in some editors.v2.4.8Compare Source
Patch Changes
#9488
bc709f6Thanks @mvanhorn! - Fixed #9463: the "Biome found a configuration file outside of the current working directory" diagnostic now includes the configuration file path and the working directory, giving users actionable information to debug the issue.#9527
2f8bf80Thanks @mdm317! - Fixed #8959: Fixed TypeScript arrow function formatting when a comment appears after=>.#9525
e7b3b10Thanks @ViniciusDev26! - Added the rulenoDrizzleUpdateWithoutWhereto prevent accidental full-table updates when using Drizzle ORM without a.where()clause.#9531
1302740Thanks @ematipico! - Fixed #9187: Astro frontmatter containing regex literals with quotes (/'/,/"/) or dashes (/---/) no longer causes parse errors.#9535
b630d93Thanks @leno23! - Fixed #9524: remove extra space before>whenbracketSameLineis true and the self-closing slash is absent in HTML formatter.#9537
81e6306Thanks @ematipico! - Fixed #9238: The HTML parser no longer incorrectly reports---inside element content (e.g.<td>---</td>) as an "Unexpected value or character" error.#9532
4b64145Thanks @ematipico! - Fixed #9117:biome check --writeno longer falsely reports Svelte and Vue files as changed whenhtml.formatter.indentScriptAndStyleis enabled and the files are already correctly formatted.#9528
61451efThanks @ematipico! - Fixed #9341: Fixed an LSP crash that could corrupt file content when saving with format-on-save enabled.#9538
794f79cThanks @ematipico! - Fixed #9279: The rulenoSubstrnow detects.substr()and.substring()calls in all expression contexts, including variable declarations, function arguments, return statements, and arrow function bodies.#9462
c23272cThanks @ematipico! - Fixed #9370: The resolver now correctly prioritizes more specificexportspatterns over less specific ones. Previously, a pattern like"./*"could match before"./features/*", causing resolution failures for packages with overlapping subpath patterns.#9515
f85c069Thanks @shivamtiwari3! - Fixed #9506 and #9479: Biome no longer reports false parse errors on<script type="speculationrules">and<script type="application/ld+json">tags. These script types contain non-JavaScript content and are now correctly skipped by the embedded language detector.#9514
7fe43c8Thanks @ematipico! - Fixed #6964: Biome now correctly resolves the.gitignorefile relative tovcs.rootwhen configured. Previously, thevcs.rootsetting was ignored and Biome always looked for the ignore file in the workspace directory.#9521
af39936Thanks @ematipico! - Fixed #9483. Now the rulenoRedeclaredoesn't panic when it encounters constructor overloads.#9490
60cf024Thanks @willfarrell! - Added support for modern CSS properties, pseudo-classes, and pseudo-elements.New known properties:
dynamic-range-limit,overlay,reading-flow,reading-order,scroll-marker-group,scroll-target-group.New pseudo-elements:
::checkmark,::column,::picker,::picker-icon,::scroll-button,::scroll-marker,::scroll-marker-group.New pseudo-classes:
:active-view-transition-type,:has-slotted,:target-after,:target-before,:target-current.#9526
4d42823Thanks @ematipico! - Fixed #9358 and #9375. Now attributes that have text expressions such asclass={buttonClass()}are correctly tracked in Svelte files.#9520
61f53eeThanks @ematipico! - Fixed #9519. NownoUnusedVariablesdoesn't flag variables that are used astypeoftype.#9487
331dc0dThanks @mvanhorn! - Fixed #9477:source.fixAll.biomeno longer sorts imports whensource.organizeImports.biomeis disabled in editor settings. The organize imports action is now excluded from the fix-all pass unless explicitly requested.#9525
e7b3b10Thanks @ViniciusDev26! - Added the rulenoDrizzleDeleteWithoutWhereto prevent accidental full-table deletes when using Drizzle ORM without a.where()clause.v2.4.7Compare Source
Patch Changes
#9318
3ac98ebThanks @ematipico! - Added new nursery lint ruleuseBaselinefor CSS. The rule reports when CSS properties, property values, at-rules, media conditions, functions, or pseudo-selectors are not part of the configured Baseline tier.For example, at the time of writing, the rule will trigger for the use of
accent-colorbecause it has limited availability:#9272
2de8362Thanks @terror! - Added the nursery ruleuseImportsFirstthat enforces all import statements appear before any non-import statements in a module. Inspired by the eslint-plugin-importimport/firstrule.#9285
93ea495Thanks @dyc3! - FixednoUndeclaredVariablesfrom erroneously flagging props only used in the template section in Vue SFCs#9435
6c5a8f2Thanks @siketyan! - Fixed #9432: Values referenced as a JSX element in Astro/Vue/Svelte templates are now correctly detected;noUnusedImportsanduseImportTyperules no longer reports these values as false positives.#9362
fc9ca4cThanks @Netail! - Extra rule source references.biome migrate eslintshould do a bit better detecting rules in your eslint configurations.#9392
b881feaThanks @g-ortuno! - Fixed biomejs/biome-vscode#959: LSP now correctly resolves project directory whenconfigurationPathpoints to a configuration file outside the workspace.#9420
a1c46afThanks @ematipico! - Fixed #9385:noUselessEscapeInStringno longer incorrectly flags valid CSS hex escapes (e.g.\e7bb) as useless. The rule now recognizes all hex digits (0-9,a-f,A-F) as valid escape characters in CSS strings.#9416
f2581b8Thanks @ematipico! - Fixed #9131, #9112, #9166: the formatter no longer crashes or produces corrupt output when a JS file withexperimentalEmbeddedSnippetsEnabledcontains non-embedded template literals alongside embedded ones (e.g.console.log(\test`)next tographql(`...`)`).#9344
cb4d7d7Thanks @ematipico! - Fixed #6921:noShadowno longer incorrectly flags destructured variable bindings in sibling scopes as shadowing. Object destructuring, array destructuring, nested patterns, and rest elements are now properly recognized as declarations.#9360
bc5dd99Thanks @ematipico! - Fixed #7125: The rulenoShadowno longer incorrectly flags parameters in TypeScript constructor and method overload signatures.#9371
29cac17Thanks @ematipico! - Fixed #5279: Tabs in diagnostic diff output are now rendered at a consistent width across context and changed lines, fixing visual misalignment when source files use tab indentation.#9043
61e2a02Thanks @dyc3! - Fixed #8897: Biome now parses@utilitynames containing/when Tailwind directives are enabled.#9354
930c858Thanks @denbezrukov! - Improved CSS parser recovery for invalidunicode-rangevalues that mix wildcard ranges with range intervals. For example, Biome now reports clearer diagnostics for invalid syntax like:with diagnostics such as:
#9355
78e74a2Thanks @SchahinRohani! - Fixed #9349: Biome now correctly handles Vue dynamic:altandv-bind:altbindings inuseAltText, preventing false positives in.vuefiles.#9369
b309ddeThanks @costajohnt! - Fixed #9210:useAnchorContentno longer reports an accessibility error for AstroImagecomponents inside links when they provide non-emptyalttext.#9345
70c2d4eThanks @ematipico! - Fixed #7214:useOptionalChainnow detects optional chain patterns that don't start at the beginning of a logical AND expression. For example,bar && foo && foo.lengthis now correctly flagged and fixed tobar && foo?.length.#9311
78c4e9bThanks @ruidosujeira! - Fixed #9245: theuseSemanticElementsrule no longer suggests<output>forrole="status"androle="alert". The<output>element is only arelatedConceptof these roles, not a direct semantic equivalent. These roles are now excluded from suggestions, aligning with the intended behavior of the upstreamprefer-tag-over-rolerule.#9363
b2ffb4aThanks @ematipico! - Fixed #5212:useSemanticElementsno longer reports a diagnostic when a semantic element already has its corresponding role attribute (e.g.<nav role="navigation">,<footer role="contentinfo">). These cases are now correctly left tonoRedundantRoles.#9364
1bb9edcThanks @xvchris! - Fixed #9357. Improved the information emitted by some diagnostics.#9434
bf12092Thanks @siketyan! - Fixed #9433:noBlankTargetnow correctly handles dynamic href attributes, such as<a href={company?.website} target="_blank">.#9351
5046d2bThanks @Netail! - Expanded thenoNegationElserule to cover the inequality & strict inequality operator.#9353
2a29e0dThanks @Conaclos! - Fixed #7583:organizeImportsnowsorts named specifiers inside bare exports and merges bare exports.
Also,
organizeImportsnow correctly adds a blank line between an import chunkand an export chunk.
import { A } from "package"; + export { A };#8658
bdcc934Thanks @rksvc! - When thedomainsfield is set in the configuration file, domains is now automatically enabled when Biome detects certain dependencies inpackage.json.#9383
f5c8bf0Thanks @ematipico! - Fixed #6606: The type inference engine now resolvesRecord<K, V>types, synthesizing them as object types with index signatures. This improves accuracy for type-aware lint rules such asnoFloatingPromises,noMisusedPromises,useAwaitThenable, anduseArraySortComparewhen operating on Record-typed values.#9359
701ddd3Thanks @ematipico! - Fixed #7516:noUnusedImportsno longer reports a false positive when a local variable shadows an imported type namespace that is still used in a type annotation.#9473
50e93bdThanks @ematipico! - Improved the detection of variables inside Astro files. Now the rulenoUnusedVariablesand others will trigger fewer false positives.#9459
171b2eeThanks @ematipico! - Fixed #9314. Now Biome doesn't panic whenuseAriaPropsForRoleis configured using an object.#9465
c8918d6Thanks @Netail! - Fixed #9464: Temporal is now correctly detected as a global.#9367
722f0daThanks @Netail! - Added the nursery rulenoTopLevelLiterals. It requires the root-level value to be an array or object.Invalid:
"just a string"#9333
a294b89Thanks @terror! - Fixed #9310. Now the HTML formatter doesn't mangle elements that are followed by self-closing elements such as<br>or<img>.#9391
4bffb66Thanks @ematipico! - Slightly increased the performance of the CLI in projects that have more than ~2K files.#9365
776cb64Thanks @Netail! - Added the nursery rulenoEmptyObjectKeys, which disallows the use of empty keys in JSON objects.Invalid:
{ "": "value" }v2.4.6Compare Source
Patch Changes
#9305
40869b5Thanks @ematipico! - Fixed #4946:noUnreachableno longer reports code insidefinallyblocks as unreachable when there is abreak,continue, orreturnin the correspondingtrybody.#9303
464910cThanks @ematipico! - Fixed #2786: The formatter no longer produces different output on subsequent runs when acaseclause has a trailing line comment followed by a single block statement.#9324
6294aa2Thanks @arendjr! - Fixed#7730:useAnchorContentnow recognises SolidJS'sinnerHTMLthe same way as React'sdangerouslySetInnerHTML.#9298
1003229Thanks @Netail! - Fixed#9296, so comments are moved along with the attributes in the useSortedAttributes assist rule code fix.#9329
855b451Thanks @dyc3! - Improved performance ofnoEmptyBlockStatements. The rule is now smarter about short-circuiting its logic.#9326
85dfe9bThanks @dyc3! - Improved performance fornoImportCyclesby explicitly excluding node_modules from the cycle detection. The performance improvement is directly proportional to how big your dependency tree is.#9323
d5ee469Thanks @ematipico! - Fixed #9217 and biomejs/biome-vscode#959, where the Biome language server didn't correctly resolve the editor settingconfigurationPathwhen the provided value is a relative path.#9302
86fbc70Thanks @sepagian! - Fixed #9300: Lowercase component member expressions like<form.Field>in Svelte and Astro files are now correctly formatted.v2.4.5Compare Source
Patch Changes
#9185
e43e730Thanks @dyc3! - Added the nursery ruleuseVueScopedStylesfor Vue SFCs. This rule enforces that<style>blocks have thescopedattribute (ormodulefor CSS Modules), preventing style leakage and conflicts between components.#9184
49c8fdeThanks @chocky335! - Improved plugin performance by batching all plugins into a single syntax visitor with a kind-to-plugin lookup map, reducing per-node dispatch overhead from O(N) to O(1) where N is the number of plugins.#9283
071c700Thanks @dyc3! - FixednoUndeclaredVariableserroneously flagging functions and variables defined in the<script setup>section of Vue SFCs.#9221
4612133Thanks @ematipico! - Fixed an issue where the JSON reporter didn't contain the duration of the command.#9294
1805c8fThanks @Netail! - Extra rule source reference.biome migrate eslintshould do a bit better detecting rules in your eslint configurations.#9178
101b3bbThanks @Bertie690! - Fixed #9172 and #9168:Biome now considers more constructs as valid test assertions.
Previously,
assert,expectTypeOfandassertTypewere not recognized as valid assertions by Biome's linting rules, producing false positives in
lint/nursery/useExpectand other similar rules.Now, these rules will no longer produce errors in test cases that used these constructs instead of
expect:#9173
32dad2dThanks @dyc3! - Added parsing support for Svelte's new comments-in-tags feature.The HTML parser will now accept JS style comments in tags in Svelte files.
#8952
1d2ca15Thanks @pkallos! - Added the nursery ruleuseNullishCoalescing. This rule suggests using the nullish coalescing operator (??) instead of logical OR (||) when the left operand may be nullish. This prevents bugs where falsy values like0,'', orfalseare incorrectly treated as missing. Addresses #8043#9243
1992a85Thanks @Netail! - Fixed #7813: improved the diagnostic of the ruleuseExhaustiveDependencies. The diagnostic now shows the name of the variable to add to the dependency array.#9063
3d0648fThanks @taga3s! - Added the nursery rulenoVueRefAsOperand. This rule disallows cases where a ref is used as an operand.The following code is now flagged:
#9273
f239e20Thanks @denbezrukov! - Fixed #9253: parsing of@container scroll-state(...)queries.#9259
96939c0Thanks @ematipico! - Fixed CSS formatter incorrectly collapsing selectors when a BOM (Byte Order Mark) character is present at the start of the file. The formatter now correctly preserves line breaks between comments and selectors in BOM-prefixed CSS files, matching Prettier's behavior.#9251
59e33fbThanks @ematipico! - Fixed #9249: The CSS formatter no longer incorrectly breaks ratio values (like1 / -1) across lines when followed by comments.#9284
ec3a17fThanks @denbezrukov! - Fixed #9253: removed false-positive diagnostics for valid@container/@supportsgeneral-enclosed queries.#9215
b2619a1Thanks @FrederickStempfle! - Fixed #9189:biome ciin GitHub Actions now correctly disables colors so that::error/::warningworkflow commands are not wrapped in ANSI escape codes.#9256
65ae4c1Thanks @ematipico! - Fixed JSON reporter escaping of special characters in diagnostic messages. The JSON reporter now properly escapes double quotes, backslashes, and control characters in error messages and advice text, preventing invalid JSON output when diagnostics contain these characters.#9223
5b9da81Thanks @ematipico! - Fixed an issue where the JSON reporter didn't write output to a file when--reporter-filewas specified. The output is now correctly written to the specified file instead of always going to stdout.#9154
c487e54Thanks @abossenbroek! - Fixed #9115: ThenoPlaywrightMissingAwaitrule no longer produces false positives on jest-dom matchers liketoBeVisible,toBeChecked,toHaveAttribute, etc. For matchers shared between Playwright and jest-dom, the rule now checks whetherexpect()'s argument is a Playwright locator or page object before flagging. Added semantic variable resolution so that extracted Playwright locators (e.g.const loc = page.locator('.item'); expect(loc).toBeVisible()) are still correctly flagged.#9269
33e5cdfThanks @dyc3! - Fixed a false positive wherenoUndeclaredVariablesreported bindings from Vue<script setup>as undeclared when used in<template>.This change ensures embedded bindings collected from script snippets (like imports and
defineModelresults) are respected by the rule.#9267
2c2e060Thanks @ematipico! - Fixed #9143 and #8849: ThenoUnresolvedImportsrule no longer reports false positives for several common patterns:node:fs,node:path,node:url, and other Node.js built-in modules with thenode:prefix are now accepted."typings"(instead of"types") inpackage.jsonnow resolve correctly.export { x as y } from "...") are now resolved correctly through the alias.export * as Ns from "...") are now recognized as own exports of the barrel module.#9254
f7bf12bThanks @ematipico! - Fixed #8842: The CSS formatter now correctly formats@container scroll-state()without adding an unwanted space between the function name and opening parenthesis.#9211
2d0b8e6Thanks @ematipico! - Fixed #7905. Improved the accuracy of type-aware lint rules when analyzing re-exported functions and values.Previously, when a binding was imported from another module, its type was not correctly inferred during the type analysis phase. This caused type-aware lint rules to fail to detect issues when working with re-exported imports.
The following rules now correctly handle re-exported imports:
useAwaitThenablenoFloatingPromisesnoMisusedPromisesuseArraySortCompareExample of now-working detection:
#8934
b49707cThanks @tim-we! - Fixed #8265: Biome now correctly detects test framework calls that use three arguments (label, options, callback) (e.g.,describe("foo", { retry: 2 }, () => {})). This fixes both formatting and thenoDuplicateTestHookslint rule for test frameworks like Vitest.#9191
688fd34Thanks @dyc3! - Fixed #9180: fixed a panic caused by an interaction betweennoRedundantUseStrictand the formatter[#&#
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.